home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / BG_SRC.ZIP / BG_GMOV.C < prev    next >
C/C++ Source or Header  |  1993-01-09  |  9KB  |  240 lines

  1. /*
  2.  *                     B G _ G  M  O  V  .  C
  3.  *              The graphics of moving and placing the pieces
  4.  * O.F.Ransen:    11th September 1991
  5.  * This version:   9th January   1993
  6.  */
  7.  
  8. #include "comp.h"
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <math.h>
  12. #include "bg.h"
  13.  
  14. /***************************************************************************/
  15.  
  16. static void Show_Move (short Old_Point, short Moves,
  17.                        short Old_Row,   short New_Row,
  18.                        Player_t Player) ;
  19.  
  20. static void Endpix_To_Circle (double* Start_Ang, short Center[TWOD_COORDS],
  21.                        double* Rad, short Sta[TWOD_COORDS], short End[TWOD_COORDS]) ;
  22. static void Make_Scircle_Pline (short  Pline  [NSC_POINTS][TWOD_COORDS],
  23.                                 short  Center [TWOD_COORDS], double Rad,
  24.                                 double Angle, double Delta_Ang) ;
  25. static void Make_Straight_Pline (short Pline [NSC_POINTS][TWOD_COORDS],
  26.                                  short Sta[TWOD_COORDS], short End[TWOD_COORDS]) ;
  27. static void Draw_XOR_Pline (short Pline[NSC_POINTS][TWOD_COORDS]) ;
  28. static void Weighted_Average_Line (short Line0 [NSC_POINTS][TWOD_COORDS],
  29.                                    short Line1 [NSC_POINTS][TWOD_COORDS],
  30.                                    short Line0_Power) ;
  31.  
  32. /***************************************************************************/
  33.  
  34. void Draw_Transits (Transit_t* Me, Transit_t* Him, Player_t Player)
  35. /*
  36. PURPOSE: To show the moves contained in the transit types. Me will
  37. make bewteen 0 to 4 moves, and Him will make as many as pieces Me has
  38. eaten. Me moves are in semicirles, Him moves are straight lines to the
  39. bar.
  40. */
  41. {
  42.     short m ;
  43.  
  44.     if ((Me->N_Moves > 4) || (Me->N_Moves < 0)) {
  45.         printf ("\nERROR: Me->N_Moves=%d in Draw_Transits.",Me->N_Moves) ;
  46.         Error_Exit ("Bad Me->N_Moves in Draw_Transits") ;
  47.     }
  48.  
  49.     if ((Him->N_Moves > 4) || (Him->N_Moves < 0)) {
  50.         printf ("\nERROR: Him->N_Moves=%d in Draw_Transits.",Him->N_Moves) ;
  51.         Error_Exit ("Bad Him->N_Moves in Draw_Transits") ;
  52.     }
  53.  
  54.     /* Show my moves */
  55.     for (m = 0 ; m < Me->N_Moves ; m++) {
  56.         Show_Move (Me->Old_Points[m],
  57.                    Me->Places_Movd[m],
  58.                    Me->Old_Row[m],
  59.                    Me->New_Row[m],
  60.                    Player) ;
  61.     }
  62.  
  63.     /* Show his moves (only if I have eaten recently) */
  64.     for (m = 0 ; m < Him->N_Moves ; m++) {
  65.         Show_Move (Him->Old_Points[m],
  66.                    Him->Places_Movd[m],
  67.                    Him->Old_Row[m],
  68.                    Him->New_Row[m],
  69.                    OPPONENT(Player)) ;
  70.     }
  71. }
  72.  
  73. /***************************************************************************/
  74.  
  75. static void Show_Move (short Old_Point, short Moves,
  76.                        short Old_Row,   short New_Row,
  77.                        Player_t Player)
  78. /*
  79. PURPOSE: To graphically show the motion described in the input parameters
  80. */
  81. {
  82.     short  Start [TWOD_COORDS],End[TWOD_COORDS],Center[TWOD_COORDS] ;
  83.     double Start_Ang,Radius,Delta_Ang ;
  84.     short  Pline [NSC_POINTS][TWOD_COORDS] ;
  85.     short  Circular_Pline [NSC_POINTS][TWOD_COORDS] ;
  86.  
  87.     Get_Piece_Center (&Start[XI],&Start[YI],Player,Old_Point,Old_Row,Old_Row+1,GRID_ROWS/2) ;
  88.     Get_Piece_Center (&End[XI],  &End[YI],  Player,Old_Point+Moves,New_Row,New_Row+1,GRID_ROWS/2) ;
  89.     Make_Straight_Pline (Pline,Start,End) ;
  90.     if (Old_Point + Moves > HOME_I) {
  91.         Error_Exit ("In Show_Move, Old_Point + Moves > HOME_I.") ;
  92.     } else if ((Old_Point + Moves != BAR_I) && (Old_Point != BAR_I)) {
  93.         /* Add some circular motion */
  94.         if (Player == BLACK_PLAYER) {
  95.             Delta_Ang = DELTA_ANGLE ;  /* Anti clockwise */
  96.         } else {
  97.             Delta_Ang = (-DELTA_ANGLE) ; /* Clockwise */
  98.         }
  99.         Endpix_To_Circle (&Start_Ang, Center, &Radius, Start, End) ;
  100.         Make_Scircle_Pline (Circular_Pline, Center, Radius, Start_Ang, Delta_Ang) ;
  101.         Weighted_Average_Line (Pline,Circular_Pline,8) ;
  102.     }
  103.     Draw_XOR_Pline (Pline) ;
  104. }
  105.  
  106. /***************************************************************************/
  107.  
  108. static void Endpix_To_Circle (double* Start_Ang, short Center[TWOD_COORDS], double* Radius,
  109.                        short   Start[TWOD_COORDS],  short End[TWOD_COORDS])
  110. /*
  111. PURPOSE: Give the coords of the extremes of a semicircle we return the
  112.          starting angle and the center of the semicircle.
  113. NOTES:   1) This does not specify the direction of rotation.
  114.          2) 0 degrees is to the East, 90 degrees is to the North.
  115.          3) 0,0 is always at top left.
  116.          4) Circles go from 0..360 degrees, anticlockwise, not +-180
  117. */
  118. {
  119.     short  c ;
  120.     short  Diff[TWOD_COORDS] ;
  121.     double Ang,Diff_2[TWOD_COORDS] ;
  122.  
  123.     for (c = XI ; c <= YI ; c++) {
  124.         Center [c] = (Start[c] + End[c]) / 2 ;
  125.         Diff   [c] = Start[c] - End[c] ;
  126.         Diff_2 [c] = (double)Diff[c] * (double)Diff[c] ;
  127.     }
  128.  
  129.     (*Radius) = (sqrt (Diff_2[XI] + Diff_2[YI])) ;
  130.     Ang    = asin (-(double)Diff[YI]/(*Radius)) ;
  131.     (*Radius) = (*Radius)/2.0 ;
  132.  
  133.     if (Ang < 0.0) {                   /* In lower 2 quadrants */
  134.         if (Start[XI] < End[XI]) {     /* In lower left quad   */
  135.             (*Start_Ang) = PI - Ang ;
  136.         } else {
  137.             (*Start_Ang) = TWO_PI + Ang ;
  138.         }
  139.     } else {                           /* In upper 2 quadrants */
  140.         if (Start[XI] < End[XI]) {     /* In upper left quadrant */
  141.             (*Start_Ang) = PI - Ang ;
  142.         } else {
  143.             (*Start_Ang) = Ang ;
  144.         }
  145.     }
  146. }
  147. /***************************************************************************/
  148.  
  149. static void Make_Scircle_Pline (short  Pline  [NSC_POINTS][TWOD_COORDS],
  150.                                 short  Center [TWOD_COORDS],   double Radius,
  151.                                 double Angle, double Delta_Ang)
  152. /*
  153. PURPOSE: To fill in the Pline with points on a semicircle, staring
  154.          at Angle and incrementing by Delta_Ang.
  155. NOTES:   1) Delta_Ang can be +ve or -ve, +ve Deltas move anticlockwise.
  156. */
  157. {
  158.     short p ;
  159.     for (p = 0 ; p < NSC_POINTS ; p++) {
  160.         Pline[p][XI] = Center[XI] + (short)(Radius*cos(Angle)) ;
  161.         Pline[p][YI] = Center[YI] - (short)(Radius*sin(Angle)) ;
  162.         Angle += Delta_Ang ;
  163.     }
  164. }
  165.  
  166. /***************************************************************************/
  167.  
  168. static void Make_Straight_Pline (short Pline [NSC_POINTS][TWOD_COORDS],
  169.                                  short Start[TWOD_COORDS], short End[TWOD_COORDS])
  170. /*
  171. PURPOSE: To make a set of points from the start to the end.
  172. */
  173. {
  174.     short i,c, Delta[TWOD_COORDS] ;
  175.  
  176.     for (c = 0 ; c < TWOD_COORDS ; c++) {
  177.         Delta[c] = End[c] - Start[c] ;
  178.     }
  179.  
  180.     for (i = 0 ; i < NSC_POINTS ; i++) {
  181.         for (c = 0 ; c < TWOD_COORDS ; c++) {
  182.             Pline [i][c] = Start[c] + (i*Delta[c]/(NSC_POINTS-1)) ;
  183.         }
  184.     }
  185. }
  186.  
  187. /***************************************************************************/
  188. #if DRODBAR
  189. void Draw_Dotted_Pline (short Pline[NSC_POINTS][TWOD_COORDS], short Colour)
  190. /*
  191. PURPOSE: To XOR draw the dots in the poly line handed to us.
  192. */
  193. {
  194.     ushort p ;
  195.  
  196.     for (p = 0 ; p < NSC_POINTS ; p++) {
  197.         Draw_Point (Pline[p][XI],Pline[p][YI],Colour) ;
  198.     }
  199. }
  200. #endif
  201. /***************************************************************************/
  202.  
  203. static void Draw_XOR_Pline (short Pline[NSC_POINTS][TWOD_COORDS])
  204. /*
  205. PURPOSE: To XOR draw the dots in the poly line handed to us.
  206. */
  207. {
  208.     ushort p ;
  209.  
  210.     setwritemode (XOR_PUT) ;
  211.     setcolor (WHITE) ;
  212.     for (p = 0 ; p < NSC_POINTS-1 ; p++) {
  213.         line (Pline[p][XI],Pline[p][YI],Pline[p+1][XI],Pline[p+1][YI]) ;
  214.     }
  215.     setwritemode (COPY_PUT) ;
  216.  
  217. }
  218.  
  219. /***************************************************************************/
  220.  
  221. static void Weighted_Average_Line (short Line0 [NSC_POINTS][TWOD_COORDS],
  222.                                    short Line1 [NSC_POINTS][TWOD_COORDS],
  223.                                    short Line0_Power)
  224. /*
  225. PURPOSE: To form a weighted average of Line0 and Line1, making the changes
  226.          in Line0. Line0_Power should be between 0 and 10.
  227. */
  228. {
  229.     short p,c ;
  230.     for (p = 0 ; p < NSC_POINTS ; p++) {
  231.         for (c = 0 ; c < TWOD_COORDS ; c++) {
  232.             Line0[p][c] = (Line0[p][c] * Line0_Power) +
  233.                           (Line1[p][c] * (10 - Line0_Power)) ;
  234.             Line0[p][c] = Line0[p][c] / 10 ;
  235.         }
  236.     }
  237. }
  238.  
  239. /***************************************************************************/
  240.